/**********************************************************************/
/**  Copyright (c) ECC labs. 2001-2002. All Rights Reserved.		 **/
/**********************************************************************/
/*
	Main.cpp
	Mark Papazyan

*/


#include "bincode.h"
#include <iostream>
#include <fstream>
#include <list>
#include <vector>
#include "binlongm.h"

using namespace std;

CBinCode* read_file(ifstream& in){
	string c;
	list<string> l;

///////  не стоит возвращать локальные указатели 
	CBinCode* t=NULL;
	if(!in)
		return t;
	in>>c;
	t_cnt i=0;
	i=c.size();

	while(c!="*" && c!=""){
		l.push_back(c);
		in>>c;
	}

	if(!l.size())
		return NULL;

	t=new CBinCode(l.size(), i);

	i=0;
	for(list<string>::iterator p=l.begin(); p!=l.end(); ++p){
		c=*p;
		t->row[i].num=t->row[i].bin2dec((char*)c.c_str());
		i++;
	}

	return t;
}


void subsearch(CBinCode mat)
{
	typedef list<CBinWord>::iterator IT;
	typedef list<CBinLongWord>::iterator IL;

	list<CBinWord> l;
	list<CBinWord> vec;
	mat.spec();
	CBinWord tmp(mat.k);
	t_len temp;

	for(t_src i=1; i<(I<<mat.k); i++)
	{
		tmp.num=(t_src)0;
		for(t_cnt j=0; j<mat.k; j++)
			if(i>>j &I)tmp.num^=mat.row[j].num;
			
		temp=tmp.wt();
		if(temp==mat.d){
			l.push_front(tmp);
		}
	}
	
	//contunue while not empty
	while(!l.empty()){
	t_len sz=l.size();
	CBinLongMatrix C(mat.n, sz);

	t_cnt x=0;
	for(IT p=l.begin(); p!=l.end(); ++p){
		CBinWord w=*p;
		for(t_cnt y=0; y<C.k; y++)
			C.row[y].num[x/MOD]^=(t_src)((w.num>>y&I)<<(x%MOD));
		x++;
	}
	t_cnt max_wt=0;
	CBinWord pos(mat.n);
	CBinLongWord res(sz);
	for(t_src t=1; t<(I<<C.k); t++) {

		CBinLongWord s(sz);

		for(t_cnt r=0; r<C.k; r++)
			if((t>>r)&I)s+=C.row[r];

		t_cnt wei=s.wt();
		if(max_wt<wei){
			max_wt=wei;
			res=s;
			pos.num=t;
		}
	}

	vec.push_back(pos);
	t_cnt nn=0;
	for(IT pp=l.begin(); pp!=l.end(); ++pp){
		if(res.num[nn/MOD]>>(nn%MOD)&I){
			CBinWord tmp=*pp;
			++pp;
			l.remove(tmp);
		}
	}

	}
	
//	for(IT ppp=vec.begin(); ppp!=vec.end(); ++ppp){
//		cout<<*ppp<<'\n';
//	}

	CBinCode R(mat.n-mat.k+vec.size(), mat.n);
	mat.convert();
	cout<<mat<<'\n';
	t_cnt a;
	for(a=0; a<mat.k; a++)
		R.row[a].num=mat.row[a].num;
	for(IT mm=vec.begin(); mm!=vec.end(); ++mm, a++)
		R.row[a]=*mm;
	cout<<R<<'\n';
	R.convert();
	cout<<R;
	R.spec();
	cout<<R.d;
}


int main(int argc, char* argv[])
{
    cout<<"Just a test\n";
	return 0;
}

